{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "import numpy as np\n",
    "def Sigmoid(x):\n",
    "    return 1./(1.+np.exp(-x))\n",
    "x=np.arange(-20,20,0.5)\n",
    "y=Sigmoid(x)\n",
    "plt.plot(x,y)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "import numpy as np\n",
    "def ReLU(x):\n",
    "    return(np.abs(x)+x)/2.0\n",
    "x=np.arange(-20,20,0.5)\n",
    "y=ReLU(x)\n",
    "plt.plot(x,y)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "ename": "SyntaxError",
     "evalue": "invalid syntax (<ipython-input-3-67442d3d3097>, line 8)",
     "output_type": "error",
     "traceback": [
      "\u001b[1;36m  File \u001b[1;32m\"<ipython-input-3-67442d3d3097>\"\u001b[1;36m, line \u001b[1;32m8\u001b[0m\n\u001b[1;33m    retuen s\u001b[0m\n\u001b[1;37m           ^\u001b[0m\n\u001b[1;31mSyntaxError\u001b[0m\u001b[1;31m:\u001b[0m invalid syntax\n"
     ]
    }
   ],
   "source": [
    "import numpy as np\n",
    "def Softmax(x):\n",
    "    assert(len(x.shape)==2)\n",
    "    row_max=np.max(x,axis=axis).reshape(-1,1)\n",
    "    x-=row_max\n",
    "    x_exp=np.exp(x)\n",
    "    s=x_exp/np.sum(x_exp,axis=axis,keepdims=True)\n",
    "    retuen s\n",
    "A=np.np.array([[1,6,1]])\n",
    "s=Softmax(A)\n",
    "print(\"\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "ename": "ModuleNotFoundError",
     "evalue": "No module named 'paddle'",
     "output_type": "error",
     "traceback": [
      "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[1;31mModuleNotFoundError\u001b[0m                       Traceback (most recent call last)",
      "\u001b[1;32m<ipython-input-4-a552be4daaeb>\u001b[0m in \u001b[0;36m<module>\u001b[1;34m()\u001b[0m\n\u001b[1;32m----> 1\u001b[1;33m \u001b[1;32mimport\u001b[0m \u001b[0mpaddle\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m      2\u001b[0m \u001b[1;32mfrom\u001b[0m \u001b[0mpaddle\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mnn\u001b[0m \u001b[1;32mimport\u001b[0m \u001b[0mLinear\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m      3\u001b[0m \u001b[1;32mimport\u001b[0m \u001b[0mpaddle\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mnn\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mfunctional\u001b[0m \u001b[1;32mas\u001b[0m \u001b[0mF\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m      4\u001b[0m \u001b[1;32mimport\u001b[0m \u001b[0mos\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m      5\u001b[0m \u001b[1;32mimport\u001b[0m \u001b[0mnumpy\u001b[0m \u001b[1;32mas\u001b[0m \u001b[0mnp\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
      "\u001b[1;31mModuleNotFoundError\u001b[0m: No module named 'paddle'"
     ]
    }
   ],
   "source": [
    "import paddle\n",
    "from paddle.nn import Linear\n",
    "import paddle.nn.functional as F\n",
    "import os\n",
    "import numpy as np\n",
    "import matplotlib.pyplot as plt"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "ename": "NameError",
     "evalue": "name 'paddle' is not defined",
     "output_type": "error",
     "traceback": [
      "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[1;31mNameError\u001b[0m                                 Traceback (most recent call last)",
      "\u001b[1;32m<ipython-input-10-f5ac6ed70c2f>\u001b[0m in \u001b[0;36m<module>\u001b[1;34m()\u001b[0m\n\u001b[1;32m----> 1\u001b[1;33m \u001b[0mtrain_dataset\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0mpaddle\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mvision\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mdatasets\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mMNIST\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mmode\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;34m'train'\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m",
      "\u001b[1;31mNameError\u001b[0m: name 'paddle' is not defined"
     ]
    }
   ],
   "source": [
    "train_dataset=paddle.vision.datasets.MNIST(mode='train')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "ename": "NameError",
     "evalue": "name 'train_dataset' is not defined",
     "output_type": "error",
     "traceback": [
      "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[1;31mNameError\u001b[0m                                 Traceback (most recent call last)",
      "\u001b[1;32m<ipython-input-9-8ee639a0a122>\u001b[0m in \u001b[0;36m<module>\u001b[1;34m()\u001b[0m\n\u001b[1;32m----> 1\u001b[1;33m \u001b[0mtrain_data0\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0mnp\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0marray\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mtrain_dataset\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;36m0\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;36m0\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m      2\u001b[0m \u001b[0mtrain_label_0\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0mnp\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0marray\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mtrain_dataset\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;36m0\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;36m1\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m      3\u001b[0m \u001b[1;32mimport\u001b[0m \u001b[0mmatplotlib\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mpyplot\u001b[0m \u001b[1;32mas\u001b[0m \u001b[0mplt\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m      4\u001b[0m \u001b[0mplt\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mfigure\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;34m\"Image\"\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m      5\u001b[0m \u001b[0mplt\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mfigure\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mfigsize\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;36m2\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;36m2\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
      "\u001b[1;31mNameError\u001b[0m: name 'train_dataset' is not defined"
     ]
    }
   ],
   "source": [
    "train_data0=np.array(train_dataset[0][0])\n",
    "train_label_0=np.array(train_dataset[0][1])\n",
    "import matplotlib.pyplot as plt\n",
    "plt.figure(\"Image\")\n",
    "plt.figure(figsize=(2,2))\n",
    "plt.imshow(train_data0,cmap=plt.cm.binary)\n",
    "plt.axis('on')\n",
    "plt.title('image')\n",
    "plt.show()\n",
    "print(\"图像数据形状和对应数据为:\",train_data0.shape)\n",
    "print(\"图像标签形状和对应数据为:\",train_label_0.shape,train_label_0)\n",
    "print(\"\\n输出第一个批次的第一个图像，对应标签数字为{}\".format(train_label_0))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "ename": "NameError",
     "evalue": "name 'paddle' is not defined",
     "output_type": "error",
     "traceback": [
      "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[1;31mNameError\u001b[0m                                 Traceback (most recent call last)",
      "\u001b[1;32m<ipython-input-8-4e4bd884db32>\u001b[0m in \u001b[0;36m<module>\u001b[1;34m()\u001b[0m\n\u001b[1;32m----> 1\u001b[1;33m \u001b[1;32mclass\u001b[0m \u001b[0mMNIST\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mpaddle\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mnn\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mLayer\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m      2\u001b[0m     \u001b[1;32mdef\u001b[0m \u001b[0m__init__\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m      3\u001b[0m         \u001b[0msuper\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mMNIST\u001b[0m\u001b[1;33m,\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m__init__\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m      4\u001b[0m         \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mfc1\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0mLinear\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0min_features\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;36m784\u001b[0m\u001b[1;33m,\u001b[0m\u001b[0mout_features\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;36m100\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m      5\u001b[0m         \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mfc2\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0mLinear\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0min_features\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;36m100\u001b[0m\u001b[1;33m,\u001b[0m\u001b[0mout_features\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;36m100\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
      "\u001b[1;31mNameError\u001b[0m: name 'paddle' is not defined"
     ]
    }
   ],
   "source": [
    "class MNIST(paddle.nn.Layer):\n",
    "    def __init__(self):\n",
    "        super(MNIST,self).__init__()\n",
    "        self.fc1=Linear(in_features=784,out_features=100)\n",
    "        self.fc2=Linear(in_features=100,out_features=100)\n",
    "        self.fc3=Linear(in_features=100,out_features=10)\n",
    "    def forword(self,inputs):\n",
    "        outputs1=self.fc1(inputs)\n",
    "        outputs1=F.ReLU(outputs1)\n",
    "        outputs2=self.fc2(outputs1)\n",
    "        outputs2=F.ReLU(outputs2)\n",
    "        outputs_final=self.fc3(outputs2)\n",
    "        outputs_final=F.softmax(outputs_final)\n",
    "        return outputs_final"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [],
   "source": [
    "def norm_img(img):\n",
    "    assert len(img.shape)==3\n",
    "    batch_size,img_h,img_w=img.shape[0],img.shape[1],img.shape[2]\n",
    "    img=img/255\n",
    "    img=paddle.reshape(img,[batch_size,img_h*img_w])\n",
    "    \n",
    "    return img"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "ename": "ModuleNotFoundError",
     "evalue": "No module named 'paddle'",
     "output_type": "error",
     "traceback": [
      "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[1;31mModuleNotFoundError\u001b[0m                       Traceback (most recent call last)",
      "\u001b[1;32m<ipython-input-5-f61ec2db37fc>\u001b[0m in \u001b[0;36m<module>\u001b[1;34m()\u001b[0m\n\u001b[1;32m----> 1\u001b[1;33m \u001b[1;32mimport\u001b[0m \u001b[0mpaddle\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m      2\u001b[0m \u001b[0mpaddle\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mvision\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mset_image_backend\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;34m'cv2'\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m      3\u001b[0m \u001b[0mmodel\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0mMNIST\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m      4\u001b[0m \u001b[1;32mdef\u001b[0m \u001b[0mtrain\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mmodel\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m      5\u001b[0m     \u001b[0mmodel\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mtrain\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
      "\u001b[1;31mModuleNotFoundError\u001b[0m: No module named 'paddle'"
     ]
    }
   ],
   "source": [
    "import paddle\n",
    "paddle.vision.set_image_backend('cv2')\n",
    "model=MNIST()\n",
    "def train(model):\n",
    "    model.train()\n",
    "    train_loader=paddle.io.DataLoader(paddle.vision.datasets.MNIST(mode='train'),batch_size=16,shuffle=True)\n",
    "    opt=paddle.optimizer.SGD(learning_rate=1e-2,parameters=model.parameters())\n",
    "    EPOCH_NUM=5\n",
    "    for epoch in range(EPOCH_NUM):\n",
    "        for batch_id,data in enumerate(train_loader()):\n",
    "            images=norm_img(data[0]).astype('float32')\n",
    "            labels=data[1].astype('int64')\n",
    "            predicts=model(images)\n",
    "            loss=F.cross_entropy(predicts,labels)\n",
    "            avg_loss=paddle.mean(loss)\n",
    "        if batch_id% 1000==0:\n",
    "            print(\"epoch_id:{},batch_id:{}\".format(epoch,batch_id,avg_loss.numpy()))\n",
    "        avg_loss.backword()\n",
    "        opt.step()\n",
    "        opt.clear_grad()\n",
    "    train(model)\n",
    "    paddle.save(model.stale_dice(),'./mnist.pdparams')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "ename": "ImportError",
     "evalue": "cannot import name 'image' from 'PIL' (C:\\Anaconda3\\lib\\site-packages\\PIL\\__init__.py)",
     "output_type": "error",
     "traceback": [
      "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[1;31mImportError\u001b[0m                               Traceback (most recent call last)",
      "\u001b[1;32m<ipython-input-6-aad43bd06251>\u001b[0m in \u001b[0;36m<module>\u001b[1;34m()\u001b[0m\n\u001b[0;32m      1\u001b[0m \u001b[1;32mimport\u001b[0m \u001b[0mmatplotlib\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mpyplot\u001b[0m \u001b[1;32mas\u001b[0m \u001b[0mplt\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m      2\u001b[0m \u001b[1;32mimport\u001b[0m \u001b[0mnumpy\u001b[0m \u001b[1;32mas\u001b[0m \u001b[0mnp\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m----> 3\u001b[1;33m \u001b[1;32mfrom\u001b[0m \u001b[0mPIL\u001b[0m \u001b[1;32mimport\u001b[0m \u001b[0mimage\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m      4\u001b[0m \u001b[0mimg_path\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;34m'.C:/Users/Administrator/Desktop/.ipynb_checkpoints/data/0.jpg'\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m      5\u001b[0m \u001b[0mim\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0mimage\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mopen\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mimg_path\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
      "\u001b[1;31mImportError\u001b[0m: cannot import name 'image' from 'PIL' (C:\\Anaconda3\\lib\\site-packages\\PIL\\__init__.py)"
     ]
    }
   ],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "import numpy as np\n",
    "from PIL import image\n",
    "img_path='.C:/Users/Administrator/Desktop/.ipynb_checkpoints/data/0.jpg'\n",
    "im=image.open(img_path)\n",
    "plt.imshow(im)\n",
    "plt.show()\n",
    "im=im.convert('L')\n",
    "print('原始图像形状:',np.array(im).shape)\n",
    "im=im.resize((28,28),image.ANTIALIAS)\n",
    "plt.imshow(im)\n",
    "plt.show()\n",
    "print(\"采样后图像形状：\",np.array(im).shape)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.0"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
